#include <p18F4550.h> // Declaracin de la librera de registros de funcin especial

//* Declaracion de la rutina de tratamiento de las interrupciones de alta prioridad */
void High_Int_Handler (void);


// Declaracin de variables globales
unsigned char Buf_Com[6]; // Bufer de comunicacin
unsigned char i; // Indice del bufer de comunicacin

// Vectorizacin de las interrupciones de alta prioridad
#pragma code High_Interrupt = 0x8
void High_Int (void)
{
_asm goto High_Int_Handler _endasm
}
#pragma code


#pragma interrupt High_Int_Handler
void High_Int_Handler (void)
{
	if (PIR1bits.RCIF) // Se comprueba si la interrupcin ha sido por recepcin
	{
		Buf_Com[i] = RCREG; // Se almacena el dato ledo en la posicin correspondiente
							// del bfer (acceso directo al registro)
		if (Buf_Com[0] == 24 || Buf_Com[4] == 21 || Buf_Com[3] == Buf_Com[0]+Buf_Com[1]+Buf_Com[2])
		{
			i++; // Se incrementa el ndice del bfer
			if (i==5) // Se comprueba si ha llegado 5 datos
			{
				i=0; // Se pone a 0 el ndice para iniciar la transmisin
				Buf_Com[3] = (Buf_Com[0]+Buf_Com[1]+Buf_Com[2])%256;
				TXREG=Buf_Com[i]; // Se transmite el 1dato (acceso directo al registro)
				i++; // Se incrementa el ndice del bfer
				PIE1bits.TXIE=1; // Se habilita la interrupcin por fin de transmisin
			}
		}
	}


		else if (PIR1bits.TXIF) // Se comprueba si la interrupcin ha sido por fin de transmisin
		{	
				
				if (i==5) // Se comprueba si se han transmitido los 5 datos
				{
					PIE1bits.TXIE=0; // Si se han transmitido los 5 datos
									// se deshabilita la interr. por fin de transm.
					i=0; // Se pone a 0 el ndice del bfer para la siguiente recepcin
				}
				else

				{
					
				TXREG=Buf_Com[i]; // Si no se han transmitido los 5 datos se transmite el siguiente
				i++; // Se incrementa el puntero del bfer
				}
			
		//	else
	//		{
	//			PIE1bits.TXIE=0;
		//		i=0;
	//		}	
		}
}


void main (void) // Programa Principal
{
	TRISCbits.TRISC6=0; // Se configura la lnea RC6/TX como salida
	TRISCbits.TRISC7=1; // Se configura la lnea RC7/RX como entrada
	TXSTA=0x24; // Se inicializa la transmisin con 8 bits ,en modo asncrono,
				// sin envio del BREAK y con velocidad de comunicacin alta (BRGH='1')
	RCSTA=0x90; // Se inicializa la recepcin con 8 bits y se configuran RC6 y RC7 como pines TX y RX
	BAUDCON=0x00; // Se inicializa la vel. de comun. con 8 bits (BRG='0')
					//y se desactiva la auto deteccin de velocidad de comunicacin
	SPBRG=129; // Vel. Com.=Fosc/(16*(SPBREG+1))=20000000/(16*(129+1))=9615
	RCONbits.IPEN = 0; // Se desactiva el sist. de prioridades de interrup. (todas las interr. misma prioridad)
	INTCONbits.GIE = 1; // Se activan las interrupciones a nivel global
	INTCONbits.PEIE = 1; // Se activan las interrupciones de perifricos a nivel global
	PIE1bits.RCIE=1; // Se habilita la interrupcin de recepcin del canal serie
	i=0; // Se inicializa en ndice del bfer
	while (1); // Bucle sin fin
}